perm filename EDGES1.SAI[PIC,HE] blob sn#428035 filedate 1979-03-07 generic text, type T, neo UTF8
entry ALLEDGES,MNDIAG,MJDIAG;
begin "edges1"
require "<ZPRICE>bufdec.sai" source!file;
INTERNAL PROCEDURE ALLEDGES(REFERENCE INTEGER CURBUF);
	BEGIN "ALLEDGES"

	INTEGER I,J,K,VAL,DIR,P1,BYT,ISTOP,JSTOP,OUTBUF,THR,GOODPOINT,NGB;

	OUTBUF←FNDBUF;  GETBUF(ROWS(CURBUF),COLMS(CURBUF),1,OUTBUF);

	OUTSTR("THRESHOLD:");  THR←CVD(INCHWL);  PUTTHR(THR,CURBUF);
	OUTSTR("NEIGHBORHOOD");  NGB←CVD(INCHWL);
	ISTOP←ROWS(CURBUF)-(NGB+1);
	JSTOP←COLMS(CURBUF)-(NGB+1);
	BYT←BYTSZ(CURBUF);

	FOR I←(NGB+1) THRU ISTOP DO
		BEGIN
		P1←INPTR(I,(NGB+1),CURBUF);
		FOR J←(NGB+1) THRU JSTOP DO
			BEGIN
			VAL←ILDB(P1);
			DIR←(VAL LSH -(BYT-2)) LAND '3;
			IF (VAL←VAL LAND ('777777777777 LSH (BYT-2-36)))<THR THEN CONTINUE;
			GOODPOINT←FALSE;
			CASE DIR OF
				BEGIN "CASE"

				WHILE TRUE DO
					BEGIN "HOR"
					FOR K←-NGB THRU -1 DO
						IF GETPNT(I+K,J,CURBUF)>VAL THEN DONE "HOR";
					FOR K←1 THRU NGB DO
						IF GETPNT(I+K,J,CURBUF) GEQ VAL THEN DONE "HOR";
					GOODPOINT←TRUE;
					DONE "HOR";
					END "HOR";

				WHILE TRUE DO
					BEGIN "VER"
					FOR K←-NGB THRU -1 DO
						IF GETPNT(I,J+K,CURBUF)>VAL THEN DONE "VER";
					FOR K←1 THRU NGB DO
						IF GETPNT(I,J+K,CURBUF) GEQ VAL THEN DONE "VER";
					GOODPOINT←TRUE;
					DONE "VER";
					END "VER";

				WHILE TRUE DO
					BEGIN "MAJ"
					FOR K←-NGB THRU -1 DO
						IF GETPNT(I+K,J+K,CURBUF)>VAL THEN DONE "MAJ";
					FOR K←1 THRU NGB DO
						IF GETPNT(I+K,J+K,CURBUF) GEQ VAL THEN DONE "MAJ";
					GOODPOINT←TRUE;
					DONE "MAJ";
					END "MAJ";

				WHILE TRUE DO
					BEGIN "MIN"
					FOR K←-NGB THRU -1 DO
						IF GETPNT(I+K,J-K,CURBUF)>VAL THEN DONE "MIN";
					FOR K←1 THRU NGB DO
						IF GETPNT(I+K,J-K,CURBUF) GEQ VAL THEN DONE "MIN";
					GOODPOINT←TRUE;
					DONE "MIN";
					END "MIN"

				END "CASE";

			IF GOODPOINT THEN PUTPNT(I,J,1,OUTBUF);

			END;
		END;

	FREBUF(CURBUF);   CURBUF←OUTBUF;
	END "ALLEDGES";
INTERNAL PROCEDURE MNDIAG(INTEGER OBUF,CURBUF,THR,NOISE);
    BEGIN "MNDIAG"
    INTEGER I,J,NV,LV,ISTOP,JSTOP,VAL1;

ISTOP←ROWS(OBUF);   JSTOP←COLMS(OBUF);

BEGIN
    INTEGER ARRAY VAL,COORDI,COORDJ,OVAL,LEVEL [1:JSTOP];
    BOOLEAN ARRAY STATE [1:JSTOP];

    FOR J←1 THRU JSTOP DO
	BEGIN
	STATE[J]←TRUE;
	VAL[J]←COORDI[J]←COORDJ[J]←OVAL[J]←LEVEL[J]←0;	END;

    FOR I←1 THRU ISTOP DO
	BEGIN
	FOR J←JSTOP DOWNTO 2 DO
		BEGIN
		VAL[J]←VAL[J-1];
		COORDI[J]←COORDI[J-1];
		COORDJ[J]←COORDJ[J-1];
		OVAL[J]←OVAL[J-1];
		STATE[J]←STATE[J-1];
		LEVEL[J]←LEVEL[J-1];
		END;
	VAL[1]←COORDI[1]←COORDJ[1]←OVAL[1]←STATE[1]←LEVEL[1]←0;
	FOR J←1 THRU JSTOP DO
	    BEGIN "CALC"
	    LV←OVAL[J];
	    NV←GETPNT(I,J,OBUF);
	    OVAL[J]←NV;
	    IF STATE[J] THEN
		IF NV<LV THEN 
		    BEGIN
		    IF (VAL[J]-NV)>NOISE THEN
			BEGIN
			STATE[J]←FALSE;
			IF VAL[J]>THR THEN PUTPNT((COORDI[J]+LEVEL[J]%2),(COORDJ[J]+LEVEL[J]%2),VAL[J],CURBUF);
			LEVEL[J]←0;
			END
		    END
		ELSE IF NV>LV THEN
		    BEGIN
		    COORDI[J]←I;
		    COORDJ[J]←J;
		    VAL[J]←NV;
		    LEVEL[J]←0;
		    END
		ELSE LEVEL[J]←LEVEL[J]+1
	    ELSE IF NV>LV THEN
		BEGIN
		STATE[J]←TRUE;
		COORDI[J]←I;
		COORDJ[J]←J;
		VAL[J]←NV;
		END;
	    END "CALC";
	ROWCHK(CHKROW,ROWS,I,50);
	END;
END;
    END "MNDIAG";
INTERNAL PROCEDURE MJDIAG(INTEGER OBUF,CURBUF,THR,NOISE);
    BEGIN "MJDIAG"
    INTEGER I,J,NV,LV,ISTOP,JSTOP,VAL1;

ISTOP←ROWS(OBUF);   JSTOP←COLMS(OBUF);

BEGIN
    INTEGER ARRAY VAL,COORDI,COORDJ,OVAL,LEVEL [1:JSTOP];
    BOOLEAN ARRAY STATE [1:JSTOP];

    FOR J←1 THRU JSTOP DO
	BEGIN
	STATE[J]←TRUE;
	VAL[J]←COORDI[J]←COORDJ[J]←OVAL[J]←LEVEL[J]←0;	END;

    FOR I←1 THRU ISTOP DO
	BEGIN
	FOR J←1 THRU JSTOP-1 DO
		BEGIN
		VAL[J]←VAL[J+1];
		COORDI[J]←COORDI[J+1];
		COORDJ[J]←COORDJ[J+1];
		OVAL[J]←OVAL[J+1];
		STATE[J]←STATE[J+1];
		LEVEL[J]←LEVEL[J+1];
		END;
	VAL[JSTOP]←COORDI[JSTOP]←COORDJ[JSTOP]←OVAL[JSTOP]←STATE[JSTOP]←LEVEL[JSTOP]←0;
	FOR J←1 THRU JSTOP DO
	    BEGIN "CALC"
	    LV←OVAL[J];
	    NV←GETPNT(I,J,OBUF);
	    OVAL[J]←NV;
	    IF STATE[J] THEN
		IF NV<LV THEN 
		    BEGIN
		    IF (VAL[J]-NV)>NOISE THEN
			BEGIN
			STATE[J]←FALSE;
			IF VAL[J]>THR THEN PUTPNT((COORDI[J]+LEVEL[J]%2),(COORDJ[J]-LEVEL[J]%2),VAL[J],CURBUF);
			LEVEL[J]←0;
			END
		    END
		ELSE IF NV>LV THEN
		    BEGIN
		    COORDI[J]←I;
		    COORDJ[J]←J;
		    VAL[J]←NV;
		    LEVEL[J]←0;
		    END
		ELSE LEVEL[J]←LEVEL[J]+1
	    ELSE IF NV>LV THEN
		BEGIN
		STATE[J]←TRUE;
		COORDI[J]←I;
		COORDJ[J]←J;
		VAL[J]←NV;
		END;
	    END "CALC";
	ROWCHK(CHKROW,ROWS,I,50);
	END;
END;
    END "MJDIAG";
end "edges1";